package com.hyf.serviceedu.controller;


import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.hyf.commonutils.fruit;
import com.hyf.service.config.exception.GuliException;
import com.hyf.serviceedu.entity.EduTeacher;
import com.hyf.serviceedu.entity.condition.TeacherQuery;
import com.hyf.serviceedu.mapper.EduTeacherMapper;
import com.hyf.serviceedu.service.EduTeacherService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 讲师 前端控制器
 * </p>
 *
 * @author atguigu
 * @since 2021-04-17
 */
@Api(description="讲师管理")
//@CrossOrigin //跨域
@RestController
@RequestMapping("/serviceedu/eduteacher")// 没有使用 Api 所访问的路径 // 全部的访问地址 http://localhost:8001/serviceedu/teacher/GetAlllist
public class EduTeacherController {


    @Autowired// 倒入 mapper 接口
    private EduTeacherService teacherService; // 教师表的 mapper 接口


//    @Autowired
//    private EduTeacherMapper teacherMapper;





//    @ApiOperation(value = "查询")
//    @GetMapping("getAllTeacher")
//     public Object getAllTeacher(
//           @PathVariable Wrapper id
//    ){
//
//
//        Page page=new Page(1,10);
//
//
//        IPage iPage = teacherMapper.selectMapsPage(page, id);
//
//        return iPage;
//
//     }












    // 1.查询讲师表中的所有数据
    // rest 风格   GetMapping 的作用是通过 rest风格的提交方式来的
    @ApiOperation(value = "所有讲师列表")
   // 把service 注入进来
    @Autowired // 通过Autowred注入进来
    @GetMapping("teacherList")
    public fruit teacherList(){
        List<EduTeacher> list = teacherService.list(null);
        return fruit.ok().data("items", list);
    }


//2. 讲师的逻辑删除功能
    @ApiOperation(value = "讲师的逻辑删除功能")
    @DeleteMapping("{id}")// id 值需要通过路径传递
    public fruit teacherdelete(@ApiParam(name = "id", value = "讲师ID", required = true) @PathVariable String id){// @PathVariable 这个注解就是得到路径中的id
        boolean b = teacherService.removeById(id);// 根据id 主键删除
        if(b){
            return fruit.ok();//删除成功返回一个成功
        }else {
            return fruit.error();// 删除失败返回一个失败
        }

    }

    //3. 讲师的分页查询讲师功能

    @ApiOperation(value = "分页讲师列表")
    @GetMapping("pageTeacher/{current}/{limit}")
    public fruit pagelistlimitteacher(
            @ApiParam(name = "current", value = "当前页码", required = true)
            @PathVariable long current,// 当前页
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable long limit // 每页的记录数
            ){
        // 创建 page 对象
        Page<EduTeacher> page=new Page<>(current,limit);
        // 调用方法实现分页
        // 调用方法的时候会进行一个封装
        teacherService.page(page,null);
        // 总记录数
        long total= page.getTotal();
        System.out.println("total:"+total);
        // 数据list 集合
        List<EduTeacher> records=page.getRecords();
 //int i=10/0; //异常处理

//        try {// 手动抛出制定一异常
//            int a = 10/0;
//        }catch(Exception e) {
//            throw new GuliException(20001,"出现自定义异常");
//        }

        // 创建map 集合来储存数据 第二种方法
//        Map map=new HashMap();
//
//        map.put("total",total);
//        map.put("rows",records);
//
//        return fruit.ok().data(map);
        return fruit.ok().data("total",total).data("rows",records);
    }

// 4. 条件分页查询

   // 分析 ：把条件值传到接口中，
    @ApiOperation(value = "分页条件查询讲师列表")
@PostMapping("pageTeacherCondition/{current}/{limit}")
    public fruit pageTeacherCondition(
        @ApiParam(name = "current", value = "当前页码", required = true)
        @PathVariable long current,
        @ApiParam(name = "limit", value = "每页记录数", required = true)
        @PathVariable long limit,
        @ApiParam(name = "teacher", value = "查询对象", required = false)
        @RequestBody(required = false) TeacherQuery teachercondition){
        // 创建一个 page 对象
        Page<EduTeacher> pageteacher=new Page<>(current,limit);
        // 构建条件
        QueryWrapper<EduTeacher> webPage=new QueryWrapper<>();

        // 多条件组合查询
        // mybatis 动态sql
    // 判断条件值是否为空，如果不为空 拼接条件
    String name=teachercondition.getName();// 姓名
    Integer level = teachercondition.getLevel();// 讲师头衔
    String begin = teachercondition.getBegin();// 开始时间
    String end=teachercondition.getEnd();// 结束后
    // 通过if 判断条件是否为空， 如果不为空拼接条件
    // 讲师名称
    if(!StringUtils.isEmpty(name)){
        // 构建条件
        webPage.like("name",name);// 字段名称 条件查询
    }
        // 讲师头衔
        if (!StringUtils.isEmpty(level)) {
            // 构建条件
            webPage.eq("level",level);
        }
    // 开始时间
    if(!StringUtils.isEmpty(begin)){
        // 构建条件
        webPage.ge("gmt_create",level);// 字段名称 ，时间
    }
    // 结束时间
    if(!StringUtils.isEmpty(end)){
        // 构建条件
        webPage.le("gmt_create",end);// 字段名称 ，时间
    }



    // 做一个排序 通过时间进行排序
    webPage.orderByDesc("gmt_create");

    // 调用方法实现条件分页查询
   // webPage.page(pageteacher,webPage);

    // 调用方法实现条件分页查询
        teacherService.page(pageteacher, webPage);
        long total=pageteacher.getTotal();// 总记录数
        List<EduTeacher> records=pageteacher.getRecords();// 数据list 集合
        return fruit.ok().data("total",total).data("rows",records);
}

// 5.添加讲师
/*// 添加讲师的方法接口 先前写的添加功能
@ApiOperation(value = "新增讲师")
@PostMapping("addteacher")
public fruit addTeacher(@RequestBody EduTeacher edyTeacher){// 在浏览器上输入 添加

    // 接收添加的方法
    boolean save = teacherService.save(edyTeacher);

    // 一个判断语句
    if(save){// 添加成功返回一个 fruit.ok()
        return fruit.ok();
    }else {
        // 添加失败返回一个 fruit.error()
        return fruit.error();
    }
}*/
        @ApiOperation(value = "添加讲师")
        @PostMapping("addTeacher")
        public fruit addTeacher(@RequestBody EduTeacher eduTeacher){
            // 添加接收的方法
            boolean save = teacherService.save(eduTeacher);
            if(save){// 添加成功返回一个 ok
                return fruit.ok();
            }else {// 添加失败 返回一个 error 失败
                return fruit.error();
            }

        }

// 6.根据id查询 讲师信息
// 讲师的修改功能
// 1.先根据id 进行查询功能
// 根据讲师id进行查询


    @ApiOperation(value = "根据ID查询讲师")
    @GetMapping("getTeacgerid/{id}")
    public fruit getTeacgerid(
            @ApiParam(name = "id", value = "讲师ID", required = true)
            @PathVariable String id){

        EduTeacher byId = teacherService.getById(id);
        return fruit.ok().data("teacher",byId);


    }







// 讲师修改功能
@ApiOperation(value = "修改讲师信息")
    @PostMapping("updateTeacher")
    public fruit updateTeacher(@RequestBody EduTeacher eduTeacher){
        boolean b = teacherService.updateById(eduTeacher);
        if(b){
            return fruit.ok();// 修改成功
        }else {
            return fruit.error();// 修改失败
        }

    }


}

